String 클래스
✒️ 2025-05-15 11:10 내용 수정
수제비 2024 정보처리기사 필기 5판 1권의 내용을 일부 정리
문자열을 처리하는 객체형 데이터 타입
- 문자열 데이터를 담는 간단한 형식 외에도 문자열 처리를 위한 다양한 기능을 가지고 있다.
- C언어는 문자열을 char형 배열로 표현하지만, Java는 문자열을 String 클래스로 저장한다.
- String 클래스의 인스턴스는 한 번 생성되면 값을 읽을 수만 있고 변경할 수 없다.
- 불변 객체(immutable 객체) : 인스턴스가 한 번 생성되면 그 값을 변경할 수 없는 객체
- String은 내부적으로 배열로 되어있어서 배열의 길이를 변경할 수 없다.
- 배열(Arrays) 참고
- String 클래스는 최초로 지정된 문자열 이후에 값이 변경되거나 추가되면 내부적으로 새로운 메모리를 할당해 새롭게 문자열을 등록한다.
- 이전 Heap에 저장된 값은 가비지 컬렉터가 회수해간다.
- String을 여러 개 결합할 시 메모리 문제가 발생할 수 있다.
- StringBuffer와 StringBuilder 클래스로 이를 해결할 수 있다.
String 생성
리터럴 : String 인스턴스이름 = "문자열";
객체 생성 : String 인스턴스이름 = new String();
// 문자열 리터럴
// 힙 메모리 내 String Pool에 저장됨
String alpha = "test";
String beta = "test";
// 문자열 객체
// 힙 메모리의 다른 영역에 저장됨
String gamma = new String("test");
| 생성자 | 설명 |
|---|---|
String(String original) |
전달 받은 String 객체 original로 새로운 String 초기화 |
String(char value\[]) |
문자 배열 요소로 구성된 새 String 초기화 |
String(char\[], int offset, int count) |
문자 배열 요소로 구성된 새 String 초기화 시작 위치 offset과 문자수 count로 원하는 범위의 문자만 사용 가능함 |
String Pool
Java에서 문자열 리터럴을 관리하기 위해 사용되는 공간
- 참고 자료 : F-Lab 자바의 스트링 풀(String Pool) 이해하기
- 힙 메모리 영역에 위치한다.
- Java에서 문자열 리터럴은 불변(immutable)하기 때문에, 한 번 생성된 문자열은 변경되지 않고 재사용할 수 있다.
- 동일한 문자열 리터럴에 대해 여러 참조가 같은 객체를 참조할 수 있어 메모리 사용량을 줄여준다.
// 두 String 변수는 String Pool 내의
// 같은 String Literal을 참조한다.
String alpha = "test";
String beta = "test";
- 문자열(String)은 문자열 리터럴 생성 방식과
new키워드 사용 방식으로 생성한다. - 이 때 문자열 리터럴 방식은 String Pool에 문자열을 저장하고,
new키워드 방식은 매번 새로운 문자열 객체를 생성한다.new키워드 방식으로 생성된 문자열 객체는 힙 메모리의 다른 영역에 저장된다.
- 따라서 중복되는 문자열을 사용하는 경우엔 String Pool을 사용하는 것이 메모리 사용과 성능 측면에서 더 효율적이다.
// 문자열 리터럴
// 힙 메모리 내 String Pool에 저장됨
String alpha = "test";
String beta = "test";
// 문자열 객체
// 힙 메모리의 다른 영역에 저장됨
String gamma = new String("test");

String 변형
1. String의 연결
- String 클래스의 변수들도 증가형 연산자(
+, +=)를 사용하여 합칠 수 있다.- 다만 이는 기존 문자열의 내용이 변경되는 것이 아니라 내용이 합쳐진 새로운 String 인스턴스가 생성되는 것
String.concat(String str): 더하려는 값을new String()으로 만든다.- 초기값이 null이 아니어야 한다.
- 계속해서 이어 붙인다면 붙일 때마다 주소값을 할당 받는다.
- 참고 자료 : D.young JAVA 문자열 붙이는 방식의 차이(concat, +, StringBuilder)
concat()로 붙인 자료를 인스턴스(객체)에 할당해줘야 한다.- 단순 호출만 하고 끝내지 말고 객체를 꼭 할당해야 하며, 그러지 않을 경우 초기값으로만 나온다.
- StringBuilder : StringBuffer와 StringBuilder 클래스 참고
2. String의 분리
-
charAt(int index)로 원하는 위치의 문자를 가져올 수 있다. 이를 따로 저장하면 문자열을 분리할 수 있지만 조금 번거롭다. -
substring()을 사용하면 문자열을 원하는 위치에서 자를 수 있으므로, 자른 문자열을 다른 String에 저장하여 분리할 수 있다. -
String[] split(String regex)메서드를 사용하면 String을 특정 기준으로 문자열을 나누어 배열로 저장할 수 있다. -
int 등의 숫자를 문자 또는 문자열로 바꿀 때 StringBuilder 등을 사용하여 번거롭게 바꾸는 대신,
int + "" + int처럼 "" 기호를 넣어 연결 시켜주면 변환할 수 있다.- Wrapper 클래스도 참고.
3. 기타 유의사항
- 특수 문자를 출력할 때 몇몇 문자는
\,"를 넣어줘야 String으로 출력할 수 있다. - 정규 표현식에서
%를 출력할 때는%%를 써야 한다.
메서드
| 메서드 | 설명 |
|---|---|
int length() |
문자열의 길이를 반환 |
char charAt(int Index) |
문자열을 하나의 단어 단위로 출력. 매개변수는 추출할 문자열 위치를 받음 |
int indexOf(String ch) |
문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치를 반환. 해당 문자열에 전달된 문자나 문자열이 포함되지 않았으면 -1을 반환 |
String replaceAll(A, B) |
A(또는 범위)를 B로 변환. 정규식을 인식할 수 있음 |
String substring(int end) 또는 String substring(a, b) |
문자열을 원하는 위치에서 자를 때 사용. 입력된 시작 위치부터 문자열의 마지막 전까지, 혹은 (a <= x < b)까지 반환 |
String repeat(int n) |
String 전체 값을 n번 반복하여 반환 |
concat(String str) |
현재 String에 마지막에 매개변수로 전달된 String을 순차(concatenate)로 이어줌 |
toCharArray() |
현재 String을 새 문자 배열로 변환 |
byte[] getBytes() |
String을 byte[]로 변환, 파일 출력 시 사용 가능 |
String[] split(String regex) |
매개 변수로 전달된 정규 표현식 또는 특정 문자를 기준으로 문자열을 나누어 배열에 저장 후 반환 정규식을 ""로 기재하면 문자 단위로 쪼갤 수 있다. |
String[] split(String regex, int limit) |
위의 split()에서 최대 분할 수 limit을 양수로 설정하면 limit의 수만큼 분할, 음수라면 가능한 모든 위치에서 분할 |
join(CharSequence delimiter, .. elements) |
연속된 문자열 요소들(배열같은거)를 연결하여 새 String으로 만듦 |
boolean equals(Object o) |
오브젝트와 스트링이 같은지 비교, 문자열끼리 비교할 때 사용(객체 주소까지 체크함) |
boolean matches(String regex) |
해당 문자열이 주어진 정규식 표현과 일치하는지 확인 |
trim() |
문자열의 시작 부분과 끝 부분에 존재하는 공백 제거. 유니코드 \u0020 이하의 공백만 제거할 수 있다. |
strip() |
trim()과 비슷하지만 유니코드의 공백을 모두 제거 |
int compareTo(String str) |
해당 문자열을 인수로 전달 받은 문자열과 사전 편찬 순으로 비교. 대소문자를 구분함. 같으면 0, (해당 문자열 < 전달 받은 문자열)이면 음수, 크면 양수 |
int compareToIgnoreCase(String str) |
대소문자를 구분하지 않은 compareTo() |
boolean contains(CharSequence s) |
해당 문자열에 전달 받은 char 시퀀스가 있는지 확인. |
toLowerCase(String str) |
문자열을 모두 소문자로 변환 |
toUpperCase(String str) |
문자열을 모두 대문자로 변환 |
boolean isEmpty() |
해당 문자열의 길이가 0이면 true, 아니면 false를 반환 |
void chars() |
문자열을 IntStream으로 변환 |
valueOf(int i) 등 |
다양한 데이터 유형을 문자열로 변환. ""을 사용하여 변환하는 것 보다 속도가 빠르다. |
boolean startsWith(String s) |
전달 받은 문자열이 해당 문자열의 접두사인지 확인하고 true/false를 리턴 비교할 때 공백의 유무를 꼭 확인해야 한다. |
boolean endsWith(String s) |
전달 받은 문자열이 해당 문자열의 접미사인지 확인하고 true/false를 리턴 마찬가지로 공백의 유무를 꼭 확인해야 한다. |
정규 표현식
- 정규 표현식 참고.
- 내용 참고 : https://adjh54.tistory.com/104
- Day 21 문자열, 사칙연산, 시뮬레이션, 2차원배열, 수학, 배열#1. 숨어있는 숫자의 덧셈 (2)
split("\\D+")
- Day 23 배열, 정렬, 문자열#3. 옹알이 (1)